from django.contrib import admin
from django.db.models import Q
from django.contrib import messages
from django.utils.safestring import mark_safe

from interview.models import Candidate
from interview import candidate_fieldset as Cf
from interview import dingtalk
import logging

from django.http import HttpResponse
from datetime import datetime
import csv
# 6 开始定义我们导入导出的日志信息
from jobs.models import Resume

logger=logging.getLogger(__name__)

# Register your models here.
# 5.1 定义导出的字段
export_fields=('username', 'city', 'bachelor_school', 'master_school', 'degree', 'first_result',
              'first_interviewer_user', 'second_result', 'second_interviewer_user', 'hr_result',
              'hr_interviewer_user', 'hr_remark')
# 通知一面面试官面试
def notify_interviewer(modeladmin,request,queryset):
    candidates= ""
    interviewers= ""
    for obj in queryset:
        candidates= obj.username+";"+candidates
        interviewers=obj.first_interviewer_user.username+";"+interviewers
    dingtalk.send(f"招聘系统正式启动通知，我们从11月/28号开始，请安排好工作{candidates,interviewers}")
    messages.add_message(request, messages.INFO, "已经成功发送面试通知消息")

# 5 我们实现导出一个函数导出csv文件格式,这里这个函数接收固定的参数
def export_model_as_csv(modeladmin,request,queryset):
    response=HttpResponse(content_type='text/csv')
    fieled_list=export_fields
    response['Content-Disposition'] = 'attachmont; filename=recruitment-candidates-list-%s.csv'% (
        datetime.now().strftime("%Y-%m-%d-%H-%M-%S"),
    )
    # 5.2开始写入表头
    writer=csv.writer(response)
    writer.writerow(queryset.model._meta.get_field(f).verbose_name.title() for f in fieled_list)
    # 5.3 开始读取每个字段的值，写入到csv文件中
    for obj in queryset:
        # 定一个空列表获取每一行的数据值
        csv_line_values=[]
        for field in fieled_list:
            field_object=queryset.model._meta.get_field(field)
            field_value=field_object.value_from_object(obj)
            # 添加值
            csv_line_values.append(field_value)
        writer.writerow(csv_line_values)
        # 6.1 记录谁导出的日志信息
        logger.info("%s exported %s candidate records " % (request.user,len(queryset)))
    return response
# 对应5.4
notify_interviewer.short_description="通知面试官"
export_model_as_csv.short_description = "导出csv文件"
export_model_as_csv.allowed_permissions = ('export',)
# 1.开始定义我们需要展现和不展现出来的信息
class CandidateAdmin(admin.ModelAdmin):

    # 1.1 exclude：作用域是不展现的字段
    exclude = ('creator', 'created_date', 'modified_date')
    # 5.4 定义一个列表，在我们筛选的地方，可以选择然后导出
    actions = [export_model_as_csv,notify_interviewer,]
    # 定义当前用户是否导出的权限
    def has_export_permission(self,request):
        opts=self.opts
        return request.user.has_perm("%s.%s"%(opts.app_label,"export"))

    # readonly_fields = ('first_interviewer_user','second_interviewer_user')
    def get_group_names(self,user):
        group_names=[]
        for g in user.groups.all():
            group_names.append(g.name)
        return group_names

    def get_readonly_fields(self, request, obj):
        group_names=self.get_group_names(request.user)
        if 'interviewer' in group_names:
            logger.info('interviewer is in user s group for %s '% request.user.username)
            return ('first_interviewer_user','second_interviewer_user')
        return ()

    default_list_editable = ('first_interviewer_user','second_interviewer_user')
    def _get_list_editable(self, request):
        group_names=self.get_group_names(request.user)
        if request.user.is_superuser or 'hr' in group_names:
            return self.default_list_editable
        return ()
    def get_changelist_instance(self, request):
        self.list_editable=self._get_list_editable(request)
        return super(CandidateAdmin,self).get_changelist_instance(request)
    # 1.2 list_display: 作用域是展现出的字段
    '''
        字段的意思:
        username: 姓名 , city: 城市, bachelor_school: 本科学校, first_score: 初试分, first_result: 初试结果, 
        first_interviewer: 面试官, second_result: 初试备注, hr_score: HR复试综合等级, hr_result: HR复试结果,
        last_editor: 最后编辑者
    '''
    list_display = (
        'username','city','bachelor_school','get_resume','first_score','first_result','first_interviewer_user','second_result',
        'second_interviewer_user','hr_score','hr_result','last_editor'
        
    )
    # 4.2 筛选条件的字段
    list_filter = ('city', 'first_score', 'second_score', 'hr_score', 'first_interviewer_user',
                   'second_interviewer_user', 'hr_interviewer_user')
    # 4.3 默认排序字段
    ordering = ('hr_result', 'second_result', 'hr_result')
    # 4.1 我们开始定义我们的搜索字段
    search_fields = ('username', 'phone', 'email')
    # 3. 我们开始定义分组，第一行我们每个元素都是列表，第二个我用了map,然后我这里分了四个组
    # 3.1 我们在上边做了三个字段不展示，所以下边我们的分组也要删除,要不然会报错说没有这个字段。
    # 3.2 我们删除完后，其实看页面，我们还是觉得很多，这时候我们可以一行展示多个,方法就是把字段元组()扩在一起成为一个列表,


    # 定义查看简历跳转链接
    def get_resume(self,obj):
        if not obj.phone:
            return ""
        resumes=Resume.objects.filter(phone=obj.phone)
        if resumes and len(resumes)>0:
            return mark_safe(f"<a href='/resume/{resumes[0].id}'target='_blank'>{'查看简历'}</a")
        return ""
    get_resume.short_description = "查看简历"
    get_resume.allow_tags=True
    # 7 我们开始定制我们面试官的权限
    # 对不是管理员非HR获取数据的集合,然后这里引入了django的Q表达式是sql中的and or作用
    def get_queryset(self,request):
        # 获取权限
        qs=super(CandidateAdmin, self).get_queryset(request)
        group_names=self.get_group_names(request.user)
        if request.user.is_superuser or 'hr' in group_names:
            return qs
        return Candidate.objects.filter(
            Q(first_interviewer_user=request.user)| Q(first_interviewer_user=request.user)
        )

    def get_fieldsets(self, request, obj=None):
        group_names=self.get_group_names(request.user)
        # 开始判断,这是一面的权限
        if 'interview' in group_names and obj.firts_interviewer_user==request.user:
            return Cf.default_fieldsets_fist
        if 'interview' in group_names and obj.firts_interviewer_user==request.user:
            return Cf.default_fieldsets_second
        # 如果我们两者都不是返回
        return Cf.default_fieldsets


    def save_model(self, request, obj, form, change):
        obj.las_editor=request.user.username
        if not obj.creator:
            obj.creator=request.user.username
        obj.modified_data=datetime.now()
        obj.save()
# 2. 我们在定义完不需要展现的东西后，需要在这里注册我们的admin
admin.site.register(Candidate,CandidateAdmin)
